package cn.bluech.lib.ui.widget;

import android.content.Context;
import android.util.AttributeSet;
import android.view.View;
import android.view.WindowManager;
import android.widget.ListPopupWindow;
import android.widget.PopupWindow;

import androidx.appcompat.widget.AppCompatAutoCompleteTextView;

import java.lang.reflect.Field;
import java.lang.reflect.Method;

/**
 * Description: 由于系统自带的AutoCompleteTextView在Android 6.0/8.0/8.1(7.0正常)下，当软键盘弹出后
 *     界面被挤压，均存在不同程度的位置偏差(竖屏垂直方向)，这个类通过反射在调用显示后重新定位锚点坐标，目前
 *     在Android 8.1测试正常
 *     支持包的控件受主题影响，较早期的主题会出现无法获取焦点问题(无法输入)，Theme.AppCompat.Light 正常
 * Create by Codeant on 2019/9/6.
 */
public class FollowAutoCompleteTextView extends AppCompatAutoCompleteTextView {
    public FollowAutoCompleteTextView(Context context) {
        super(context);
    }

    public FollowAutoCompleteTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public FollowAutoCompleteTextView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    @Override
    public void showDropDown() {
        super.showDropDown();

        relocate();
    }

    private void relocate(){
        PopupWindow popup;
        View anchorView;
        WindowManager.LayoutParams params;

        try{
            Class<?> cls = getClass().getSuperclass().getSuperclass(); // AutoCompleteTextView
            Field field = cls.getDeclaredField("mPopup");
            field.setAccessible(true);
            ListPopupWindow listPopup = (ListPopupWindow) field.get(this);

            field = listPopup.getClass().getDeclaredField("mPopup");
            field.setAccessible(true);
            // 获取锚点
            anchorView = listPopup.getAnchorView();
            popup = (PopupWindow)field.get(listPopup);

            Class<?> popupCls = popup.getClass();
            Method alignToAnchor = popupCls.getDeclaredMethod("alignToAnchor");
            alignToAnchor.setAccessible(true);
            Method getDecorViewLayoutParams = popupCls.getDeclaredMethod("getDecorViewLayoutParams");
            getDecorViewLayoutParams.setAccessible(true);

            params = (WindowManager.LayoutParams) getDecorViewLayoutParams.invoke(popup);

            alignToAnchor.invoke(popup);
        }catch (Exception e){
            e.printStackTrace();
            return;
        }
        if(null==anchorView)
            anchorView = this;

        // 获取锚点View的坐标
        int[] sloc = new int[2];
        anchorView.getLocationOnScreen(sloc);
        // y轴偏移
        int y = sloc[1] - params.height;

        // 判断软键盘弹出与否(弹出在锚点上面显示，否则在下面)，目前似乎不用判断(软键盘关闭可能没调用这个)
        // 软键盘目前也没有一个权威的判断方式，都是间接识别
//        if(isSoftShowing()){
        popup.update(params.x, y, -1, -1, true);
        //popup.update(0, 726, -1, -1, true);
//        }else{
//        }

    }

//    private boolean isSoftShowing() {
//        //获取当屏幕内容的高度
//        int screenHeight = this.getWindow().getDecorView().getHeight();
//        //获取View可见区域的bottom
//        Rect rect = new Rect();
//        //DecorView即为activity的顶级view
//        this.getWindow().getDecorView().getWindowVisibleDisplayFrame(rect);
//        //考虑到虚拟导航栏的情况（虚拟导航栏情况下：screenHeight = rect.bottom + 虚拟导航栏高度）
//        //选取screenHeight*2/3进行判断
//        return screenHeight*2/3 > rect.bottom;
//    }
}
